package com.hadoop.demo.mapreduce.wordcount;

import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

import java.io.IOException;

/**
 * =================================
 * <p>
 * Created by cjj on 18-9-30.
 * <p>
 * 描述:
 */

// 四个泛型中：前两个是制定mapper输入数据的类型，KEYIN是输入key的类型，VALUEIN是输入的value的类型;
// map和reduce的数据输入输出都是以key-value的形式封装的；
// 默认情况下，框架传递给我们的mapper的输入数据中，key是要处理的文件中一行的其实偏移量，这一行的内容作为value
// 因为key 和value 都是要在网络中传输，所以要实现序列化接口，由于Java对自带的序列化接口有点冗余，hadoop自己实现了一套序列化接口
public class CountMapper extends Mapper<LongWritable,Text,Text,LongWritable> {


    /**
     * mapreduce框架每读取一行数据就调用一次该方法
     *
     * @param key
     * @param value
     * @param context
     * @throws IOException
     * @throws InterruptedException
     */
    @Override
    protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
        //super.map(key, value, context);
        //自己在这个方法中写具体的业务
        // key是这一行的起始偏移量 value 是这一行的数据
        String line = value.toString();
        //简单分词
        String[] split = line.split(" ");
        //把每个单词输出 通过context调用
        for (String word : split){
            context.write(new Text(word),new LongWritable(1));
        }
    }
}
